#ifndef _GRID_
#define _GRID_

#include "Point.h"
#include "Dofs.h"
#include <vector>
using namespace std;
/**
 * @brief Grid:意指Mesh中每一个小网格，包含顶点信息和自由度信息。
 * 
 * @tparam int DIM 维度
 */
template<unsigned int DIM>
class Grid
{
protected:
    int num_of_vertices; /*< 顶点的数目*/
    vector<Point<DIM>> vertices;/*< 存储顶点的vector*/
public:
    /**
     * @brief 含参构造函数
     * 
     * @param _pnts 包含顶点的vector,逆时针顺序
     */
    Grid(const vector<Point<DIM>>& _pnts): vertices{_pnts}
	{
	    num_of_vertices = _pnts.size();
	};
    /**
     * @brief 析构函数
     */    
    ~Grid() = default;
    /**
     * @brief 设置grid的顶点，逆时针顺序
     * 
     * @param _pnts 包含顶点的vector,逆时针顺序
     */
    void SetVertices(const vector<Point<DIM>>& _pnts)
	{
	    vertices.resize(_pnts.size());
	    copy(_pnts.begin(),_pnts.end(),vertices.begin());
	};
    /**
     * @brief 返回包含顶点信息的vector
     * @return 顶点vector
     */
    vector<Point<DIM>>& GetVertices()
	{
	    return vertices;
	}
    /**
     * @brief 返回第_index个顶点，从1开始
     * 
     * @param _index 顶点的下标
     * @return 第_index个顶点
     */
    const Point<DIM>& GetVertices(int _index) const
	{
	    return vertices[_index-1];
	};
    /**
     * @brief 返回顶点的个数
     * @return 顶点的个数
     */
    const int& GetNumVertices() const
	{
	    return num_of_vertices;
	};

};


#else
// Do Nothing
#endif
